package com.ruyuan2020.im.design.flyweightpattern;

import java.util.HashMap;
import java.util.Map;

public class Circle implements Shape {
    private final String color;
    private final int x;
    private final int y;
    private final int radius;

    // 构造函数私有化，因为外部的类不应该直接实例化这个类，而应该通过工厂来获取实例
    private Circle(String color, int x, int y, int radius) {
        this.color = color;
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("Circle: Draw() [Color : " + color + ", x : " + x + ", y :" + y + ", radius :" + radius + "]");
    }

    // 根据属性创建Circle的静态内部类，作为享元工厂的实现
    private static class CircleFactory {
        // 使用HashMap存储已经创建的Circle对象，实现重用
        private static final Map<String, Circle> circleMap = new HashMap<>();


        /**
         * 获取Circle对象的方法，如果Map中没有则创建一个新的Circle对象并存入Map中
         */
        public static synchronized Circle getCircle(String color ,int x,int y,int radius){
            String key = color + x + y + radius;
            if (!circleMap.containsKey(key)) {
                circleMap.put(key, new Circle(color, x, y, radius));
            }
            return circleMap.get(key); // 返回对应key的Circle对象，如果已经存在则直接重用
        }

    }
    // 提供一个静态方法来获取Circle对象，客户端应该通过这个方法来获取Circle对象而不是直接new
    public static Circle getCircle(String color, int x, int y, int radius) {
        return CircleFactory.getCircle(color, x, y, radius);
    }
}